<?php
//date格式化一个本地时间/日期
//格式字符串：（1）普通字符原样显示（2）特殊字符，有特殊的定义
echo date("北京时间：Y年m月d日 H:i:s.v e\n");
//通过构造方法创建DateTime对象
$d=new DateTime();//创建一个日期对象，默认值"now"表示当前的日期对象
$d=new DateTime("2000-10");//2000-10-1 00:00:00 000000
$d=new DateTime("2000-10-5");//2000-10-05 00:00:00 000000
$d=new DateTime("2000-10 12:34:56");//2000-10-1 12:34:56.000000
$d=new DateTime("2000-10 12:34");//2000-10-1 12:34:00 000000
$d=new DateTime("12:34");//今天的日期 2025-10-29 12:34:00 000000
$d=new DateTime("20001005 123456");//2000-10-05 12:34:56.000000
$d=new DateTime("2000/10/1 12:34:56");//必须有日 2000-10-1 12:34:56.000000
print_r($d);
//日期的格式化输出，访问对象的属性或方法用—>而不是=>
echo $d->format("Y-m-d H:i:s.v e\n");//2000-10-01 12:34:56.000 Asia/Shanghai
echo $d->format("年: Y\n");//年：2000
$a=['name'=>'zs','age'=>18];
//获取UNIX时间戳，从UTC 1970-1-1 0时到现在的秒数
$d=new DateTime("1970-1-1 8:0",new DateTimeZone('Asia/Shanghai'));
echo "UNIX时间戳：",$d->getTimestamp(),"\n";
//根据时间戳创建日期，注意时间戳前面一定要加@
echo (new DateTime("@1761723189"))->format("Y-m-d H:i:s.v e\n");//2025-10-29 07:33:09.000 +00:00
//设置时区，可以看北京时间对应的不同地区的时间
$d=new DateTime();
echo $d->format("Y-m-d H:i:s.v e\n");//2025-10-29 16:03:56.805 Asia/Shanghai
$d->setTimezone(new DateTimeZone("UTC"));
echo $d->format("Y-m-d H:i:s.v e\n");//2025-10-29 08:05:18.821 UTC
//DateTimeInterface接口，DateTime\DateTimeImmutable实现了该接口
//DateTime可变的，而DateTimeImmutable是不可变的
$d=new DateTimeImmutable("2025-10-29 12:34:56");
echo $d->format("北京时间：Y-m-d H:i:s.v e\n");
echo $d->modify("+1 day")->format("Y-m-d H:i:s.v e\n");//2025-10-30 12:34:56.000 Asia/Shanghai
echo $d->modify("-2 days")->format("Y-m-d H:i:s.v e\n");//2025-10-27 12:34:56.000 Asia/Shanghai
echo $d->setDate(2000,10,1)->format("Y-m-d H:i:s.v e\n");//2000-10-01 12:34:56.000 Asia/Shanghai
echo $d->modify("2000-10")->format("Y-m-d H:i:s.v e\n");//2000-10-01 12:34:56.000 Asia/Shanghai
echo $d->setTime(23,45)->format("Y-m-d H:i:s.v e\n");//2025-10-29 23:45:00.000 Asia/Shanghai
echo $d->modify("23:45")->format("Y-m-d H:i:s.v e\n");//2025-10-29 23:45:00.000 Asia/Shanghai
//计算本周、上周、下周 周一的日期
echo $d->modify("monday this week")->format("Y-m-d H:i:s.v e\n");//2025-10-27 00:00:00.000 Asia/Shanghai
echo $d->modify("monday last week")->format("Y-m-d H:i:s.v e\n");//2025-10-20 00:00:00.000 Asia/Shanghai
echo $d->modify("monday next week")->format("Y-m-d H:i:s.v e\n");//2025-11-03 00:00:00.000 Asia/Shanghai
//当前是第九周,求开学日期 周一的上课时间
$currentWeek=9;
echo (new DateTime())
    ->modify("monday -$currentWeek weeks + 8 hours")
    ->format("Y-m-d H:i:s.v e\n");//2025-09-01 00:00:00.000 Asia/Shanghai
//当前月1号是星期几
echo (new DateTime("2025-10"))->format("N")-1,"\n";//星期一：0 星期日：6
//当前月有几天
echo (new DateTime("2025-10"))->format("t"),"\n";

//编写函数，根据给定的年月 显示阅历
echo "     2025年10月   \n";
$d=new DateTime("2025-10");
$w=$d->format("N")-1;
$ts=$d->format("t");
echo "一 二 三 四 五 六 日\n";
for($i=0;$i<$w;++$i) echo '   ';
for($i=1;$i<=$ts;++$i){
    echo $i>=10?$i:' '.$i,' ';
    if(($i+$w)%7==0) echo  "\n";
}